之前写的 这篇文章 分析了三轮全向小车的运动,今天把尝试它部署到 Ros 上。
基本原理
参考系的定义需要根据 Ros by Example chapter 7 做一些修改:
- 定义三轮车的三个轮子分别是 A、B、C, 速度分别是a、b、c;
- 定义半径 Radius 是中点到轮子的距离;
- 定义 a,b 为前轮,c 为后轮。
三个速度平移到一点,三个速度大小分别是 a,b,c,分解到坐标系上的坐标应该是:
$$
\overrightarrow{V_a}=(-\frac{\sqrt{3}}{2}a,\frac{1}{2}a)\\
\overrightarrow{V_b}=(\frac{\sqrt{3}}{2}b,\frac{1}{2}b)\\
\overrightarrow{V_c}=(0,-c)
$$
和向量是:
$$
\overrightarrow{S}=(\frac{\sqrt{3}}{2}b-\frac{\sqrt{3}}{2}a,-c+\frac{1}{2}a+\frac{1}{2}b)
$$
以车的旋转中心为车的中心,角速度的计算公式:
$$
\omega=\frac{a+b+c}{3r}
$$
控制程序
Ros 中的的速度消息是 Twist 指定的
1 | rosmsg show geometry_msgs/Twist |
linear 中的 x 代表前进的速度,单位是 m/s 。angular 中的 z 表示角速度,单位 rad/s。
按照这个思路,Twist 消息一般提供 x y z ,需要通过这三个量反解出三个轮子所需要的速度:
$$
\begin{bmatrix}V_x \\ V_y \\ \omega\end{bmatrix}=
\begin{bmatrix}
\frac{-\sqrt{3}}{2} & \frac{\sqrt{3}}{2} & 0\\
\frac{1}{2} & \frac{1}{2} & -1\\
\frac{1}{3r} & \frac{1}{3r} & \frac{1}{3r}
\end{bmatrix}
\begin{bmatrix}a\\ b \\ c \end{bmatrix}
$$
先对矩阵求逆:
$$
\begin{bmatrix}
-\frac{\sqrt{3}}{2} & \frac{\sqrt{3}}{2} & 0\\
\frac{1}{2} & \frac{1}{2} & -1\\
\frac{1}{3r} & \frac{1}{3r} & \frac{1}{3r}
\end{bmatrix}^{-1}=
\begin{bmatrix}
-\frac{\sqrt{3}}{3} & \frac{1}{3} & r \\
\frac{\sqrt{3}}{3} & \frac{1}{3} & r \\
0 & -\frac{2}{3} & r
\end{bmatrix}
$$
带入左式:
$$
\begin{bmatrix}a\\ b \\ c \end{bmatrix}=
\begin{bmatrix}
-\frac{\sqrt{3}}{3} & \frac{1}{3} & r \\
\frac{\sqrt{3}}{3} & \frac{1}{3} & r \\
0 & -\frac{2}{3} & r
\end{bmatrix}
\begin{bmatrix}V_x\\ V_y\\ \omega\end{bmatrix}
$$
python 实现,由于小车没有编码器,只写一个发布速度:
1 | #!/usr/bin/env python |